/**
 * @file Bsp_Led.h
 * @author 徐松亮 (5387603@qq.com)
 * @version 1.0
 * @date 2023-09-28
 *
 * @copyright Copyright (c) {2030}  沈阳迈思医疗科技有限公司
 *
 * @brief 驱动层-->基于GPIO的LED驱动程序
 * @note (仅在h文件描述注释)
 * 	@verbatim
    1.适用芯片:
        STM      :  STM32F1  STM32F407xx
        Nordic   :  Nrf51    Nrf52
    2.移植步骤:
        2.1   在Bsp_Led.h中设定时钟与引脚信息。
        2.2   在主函数调用            BspLed_Init()
        2.3   在100mS循环函数中调用   BspLed_Cycle_100ms()
    3.验证方法:
        在Debug环境加入调试指令，执行后所有LED循环点亮，退出后所有LED关闭
    4.使用方法:
        用户可以调用Bsp_Led.h中的宏定义直接控制LED
    5.其他说明:无
    @endverbatim
 * @todo (仅在h文件描述待办事项)
 * @par 修改日志:
 * <table>
 * <tr><th>日期   <th>版本 <th>作者  <th>描述
 * <tr><td>2023-09-28 <td>1.0     <td>徐松亮     <td>创建初始版本
 * </table>
 */
/* 防止重复编译 (Define to prevent recursive inclusion)------------------------*/
#ifndef __BSP_LED_H
#define __BSP_LED_H
/* 通用头部文件 (General Includes)---------------------------------------------*/
/* 公有类型定义 (Exported types)-----------------------------------------------*/
typedef enum
{
    BSP_LED_E_MODE_NULL = 0,
    BSP_LED_E_MODE_ONCE,
    BSP_LED_E_MODE_FLICK,
    BSP_LED_E_MODE_PWM,
    BSP_LED_E_MODE_ON,
    BSP_LED_E_MODE_OFF,
    BSP_LED_E_MODE_TOGGLE,
} BSP_LED_E_MODE;

typedef enum
{
    BSP_LED_E_PRIORITY_LOW = 0,
    BSP_LED_E_PRIORITY_1 = BSP_LED_E_PRIORITY_LOW,
    BSP_LED_E_PRIORITY_2,
    BSP_LED_E_PRIORITY_3,
    BSP_LED_E_PRIORITY_4,
    BSP_LED_E_PRIORITY_5,
    BSP_LED_E_PRIORITY_HIGH = BSP_LED_E_PRIORITY_5,
    BSP_LED_E_PRIORITY_MAX,
} BSP_LED_E_PRIORITY;

typedef enum
{
    BSP_LED_E_PWM_ALL_OFF = 0,
    BSP_LED_E_PWM_1,
    BSP_LED_E_PWM_2,
    BSP_LED_E_PWM_3,
    BSP_LED_E_PWM_4,
    BSP_LED_E_PWM_5,
    BSP_LED_E_PWM_6,
    BSP_LED_E_PWM_7,
    BSP_LED_E_PWM_8,
    BSP_LED_E_PWM_9,
    BSP_LED_E_PWM_10,
    BSP_LED_E_PWM_ALL_ON = BSP_LED_E_PWM_10,
} BSP_LED_E_PWM_LEVEL;

typedef struct
{
    void (*fnp_DebugOutStr)(int8_t *);
    void (*fnp_LedOnOff)(uint8_t);
} BSP_LED_T_INPUT;
typedef struct
{
    void (*fnp_SetPwm)(void *_tp_interface, BSP_LED_E_PWM_LEVEL _e_pwmLevel);
    void (*fnp_SetMode)(void *_tp_interface, BSP_LED_E_MODE _e_mode, BSP_LED_E_PRIORITY _e_priority);
} BSP_LED_T_OUTPUT;
typedef struct
{
    void (*fnp_Cycle_1ms)(void *);
    void (*fnp_Cycle_100ms)(void *);
} BSP_LED_T_TRANSPLANT;
typedef struct
{
    uint8_t uc_ReadOnOff;
    //
    BSP_LED_E_PWM_LEVEL e_PwmLevel; // 0(全灭)~10(全亮)
    uint8_t uc_PwmCmt;
    uint8_t uc_CycleTimer_100ms;
    uint8_t uca_PriorityMode[BSP_LED_E_PRIORITY_MAX];
    //
    uint8_t uc_DebugTestEnable;
} BSP_LED_T_PRIVATE;

typedef struct
{
    BSP_LED_T_INPUT t_Input;
    BSP_LED_T_OUTPUT t_Output;
    BSP_LED_T_TRANSPLANT t_Transplant;
    BSP_LED_T_PRIVATE t_Private;
} BSP_LED_T_INTERFACE;

/* 公有常量声明 (Exported constants)-------------------------------------------*/
/* 移植性宏定义 (Transplant define)--------------------------------------------*/
/* 应用性宏定义 (Application define)-------------------------------------------*/
/* 公有常量声明 (Exported constants)-------------------------------------------*/
/* 公有变量声明 (Exported variables)-------------------------------------------*/
/* 公有函数声明 (Exported functions)-------------------------------------------*/
extern void BspLed_Init(BSP_LED_T_INTERFACE *_tp_interface);
extern void BspLed_DebugTestOnOff(uint8_t _uc_trueOrFalse, void *_vp_context);

#endif
/********************************END OF FILE***********************************/
